<?php
namespace app\api\controller;

use WeChatPay\Formatter;

/**
 * 支付接口
 * Class Wx
 * @package app\api\controller
 */
class Pay extends MY
{
    // **************************************************
    // ************** 微 信 支 付 *************************
    // **************************************************
    //http://localhost/Project/PhpApi/public/api.php/pay/wxCreateOrder
    /**
     * 创建预支付订单
     * @return void
     */
    public function wxCreateOrder()
    {
//        $input   = input();
//        $channel = $input["channel"];   //渠道标识，支付宝/微信/云闪付等
//        $title   = $input["goodTitle"]; //商品名称
//        $num     = $input["goodNum"];   //商品数量
//        $money   = $input["goodMoney"]; //订单金额
//        $openid  = $input["openid"];    //用户openid

        //业务逻辑
        //根据商户id、商品id、商品数量、金额等，判断库存是否足够、总额是否正确

        $order_num = md5(makeRandom(8) . microtime());
        $this->echoJson(0, ["order_num"=>$order_num]);
    }

    /**
     * h5或扫码支付
     * h5：返回支付跳转链接，为拉起微信支付收银台的中间页面，可通过访问该url来拉起微信客户端，完成支付，h5_url的有效期为5分钟。
     * 扫码支付：返回二维码链接，此URL用于生成支付二维码，然后提供给用户扫码支付。注意：code_url并非固定值，使用时按照URL格式转成二维码即可。
     * @return void
     */
    public function wxPayUrl()
    {
        $input   = input();
        $desc    = $input["desc"];
        $no      = $input["out_trade_no"];
        $amount  = (int)$input["amount"] * 100; //单位转成分
        $openid  = $input["openid"];
        $api     = $input["api"];//h5或native
        $attach  = "api={$api}";

        if (!$desc || !$no || !$amount || !$openid || !$api)
            $this->returnJson(2, "");

        $url = (new PayWX())->orderCreate("jsapi". $desc, $no, $attach, $amount, $openid);

        $this->returnJson(0, $url);
    }

    /**
     * 微信支付签名：小程序、公众号、app调起支付时需要
     *   该步骤有时可与创建预支付订单合并，减少一次请求，这个要根据业务而定；
     *   两者分开的场景：比如商家有优惠券或vip打折的，先创建创建预支付订单，下一步再计算优惠，这样可支持多样复杂的优惠计算
     * @return void
     */
    public function wxPaySign()
    {
        $input   = input();
        $desc    = $input["desc"];
        $no      = $input["out_trade_no"];
        $amount  = (int)$input["amount"] * 100; //单位转成分
        $openid  = $input["openid"];
        $api     = $input["api"];//jsapi或app
        $attach  = "api={$api}";

        if (!$desc || !$no || !$amount || !$openid || !$api)
            $this->echoJson(2, "");

        $data = (new PayWX())->paySign($api, $desc, $no, $attach, $amount, $openid);
        $this->echoJson(0, $data);
    }

    /**
     * 微信支付回调
     * @return void
     */
    public function wxNotify()
    {
        $input  = input();
        $header = Request()->header();
        $wx     = new PayWX();
        $bool   = $wx->notifyVerify($header,jsonData($input));

        if ($bool) {
            // 使用PHP7的数据解构语法，从Array中解构并赋值变量
            ["resource" => [
                "ciphertext"      => $ciphertext,
                "nonce"           => $nonce,
                "associated_data" => $aad
            ]] = $this->input;

            //加密文本消息解密
            $arr = $wx->notifyDecryptText($ciphertext, $nonce, $aad);

            if (!isset($arr["mchid"]) || $arr["mchid"] != $wx::CONFIG["merchantId"])
                $this->echoJson(2, "");

            if (!isset($arr["appid"]) || $arr["appid"] != $wx::CONFIG["appId"])
                $this->echoJson(2, "");

            if (!isset($arr["out_trade_no"]) || !isset($arr["payer"]["openid"]) || !isset($arr["attach"]) || !isset($arr["trade_state"]))
                $this->echoJson(2, "");

            //业务逻辑
            //订单状态判断 数据更新等

            //
            $this->echoJson(0,"");
        }
    }


    // **************************************************
    // ************* 支 付 宝 支 付 ***********************
    // **************************************************




}
